package com.hardware.dll;

import com.sun.jna.Native;
import com.sun.jna.win32.StdCallLibrary;

/**
 * 精伦开发文档的接口定义 sdtapi.dll
 * @作者 韩宗森
 * @创建时间 2024年10月24日 11:32
 */
public interface JinglunDLL extends StdCallLibrary {

    String path = System.getProperty("user.dir") +"\\jinglun_dll\\sdtapi";

    // 加载的 dll 文件
    JinglunDLL INSTANCE = (JinglunDLL) Native.loadLibrary(path, JinglunDLL.class);

    /**
     * 4.1.1.	端口初始化函数
     * 原    型：int InitComm (int iPort)
     * 说    明：本函数用于打开串口或USB并检测读卡设备是否就绪。
     * 参    数：iPort：设置串口、USB、USB-HID（免驱动）接口
     *
     * 串口	1 – 16(十进制)	例如：
     * 1： 1(COM1)
     * 2：2(COM2)
     * USB	1001	1001
     *
     * 返 回 值：
     * 值	意义
     * 1	正确
     * 其它	错误
     *
     * 	注：如果读卡机具连接的端口是确定的，可以直接使用相应端口号调用本函数。否则，可以采用循环查找的方式调用本函数。
     * @param iPort
     * @return  返 回 值：1:正确;  其它:错误;
     */
    int InitComm(int iPort);

    /**
     * 4.1.2.	端口关闭接口
     * 原    型：int CloseComm(void)
     * 说    明：本函数用于关闭已打开的端口，一般在调用InitComm成功并完成读卡任务后调用。
     * 参    数：无
     * 返 回 值：
     * 值	意义
     * 1	正确
     * 其它	错误
     * 注意：如果不再使用已打开的端口，必须使用CloseComm函数关闭端口。
     * @return
     */
    int CloseComm();

    /**
     * 4.2.1.	卡认证接口
     * 原    型：int Authenticate (void)
     * 说    明：本函数用于发现身份证卡并选择卡。
     * 参    数：无
     * 返 回 值：
     * 值	意义
     * 1	正确
     * 0	错误
     *
     * 注：认证卡时，需要将身份证放置于读卡机具上方并做稍许时间的停留。如果函数返回错误表示没有发现卡或者卡停留时间太短。
     * @return
     */
    int Authenticate();

// 4.2.2.	读卡信息接口 ------------  开始  ---------------------------------------------------------------------------------------

    /**
     * 读卡信息接口 - 1
     * 说    明：本函数用于读取卡中基本信息，包括文字信息与图像信息。文字信息已经分段解析，输出格式为单字节,
     * 且每一字段信息已经被表示为字符串。图象信息被解码后存为文件photo.bmp（在当前工作目录下）。
     * 参    数：
     * pMsg 	[out] 无符号字符指针，指向读到的文本信息。需要在调用时分配内存，字节数不小于192。
     * 函数调用成功后，各字段的文本信息已经转换为单字节形式，并表示为字符串格式。字段意义及偏移值如下所示：
     * @param pMsg
     * @param len
     * @return
     */
    int ReadBaseMsg(byte[] pMsg, int len);

    /**
     * 读卡信息接口 - 2
     * 说    明：本函数用于读取卡中基本信息，包括文字信息与图像信息。文字信息已经分段解析，输出格式为单字节,
     * 且每一字段信息已经被表示为字符串。图象信息被解码后存为文件photo.bmp（在directory指定目录下）。
     * @param pMsg
     * @param len
     * @param directory
     * @return
     */
    int ReadBaseMsgPhoto(char[] pMsg, int len, char[] directory);

    /**
     * 读卡信息接口 - 3
     * 说    明：本函数用于读取卡中基本信息，包括文字信息与图像信息。文字信息以字符串格式输出。
     * 照片信息被解码后存为文件photo.bmp，身份证正面图片1.jpg，身份证反面图片2.jpg（在当前工作目录下）。
     * @param Name
     * @param Gender
     * @param Folk
     * @param BirthDay
     * @param Code
     * @param Address
     * @param Agency
     * @param ExpireStart
     * @param ExpireEnd
     * @return
     */
    int ReadBaseInfos(char[] Name, char[] Gender, char[] Folk,
                      char[] BirthDay, char[] Code, char[] Address, char[] Agency, char[] ExpireStart, char[] ExpireEnd);

    /**
     * 读卡信息接口 - 4
     * 说    明：本函数用于读取卡中基本信息，包括文字信息与图像信息。文字信息以字符串格式输出。
     * 图象信息被解码后存为照片photo.bmp和photo.jpg，身份证正面图片1.jpg，身份证反面图片2.jpg（在directory指定目录下）。
     * @param Name
     * @param Gender
     * @param Folk
     * @param BirthDay
     * @param Code
     * @param Address
     * @param Agency
     * @param ExpireStart
     * @param ExpireEnd
     * @param directory
     * @return
     */
    int ReadBaseInfosPhoto(byte[] Name, byte[] Gender, byte[] Folk,
                           byte[] BirthDay, byte[] Code, byte[] Address,
                           byte[] Agency, byte[] ExpireStart,
                           byte[] ExpireEnd, byte[] directory);//此处使用了这个接口读取信息!注意只能用byte[],不能是char[];否则会乱码!转都转不了!

    /**
     * 读卡信息接口 - 5
     * 说    明：本函数用于读取卡中基本信息，包括文字信息与图像信息。文字信息未解析，文字信息采用GB13000的UCS-2进行存储，
     * 图象信息被解码后存为文件photo.bmp（在当前工作目录下）。
     * @param pMsg
     * @param len
     * @return
     */
    int ReadBaseMsgW(char[] pMsg, int len);

    /**
     * 读卡信息接口 - 6
     * 说    明：本函数用于读取卡中基本信息，包括文字信息与图像信息。文字信息未解析，文字信息采用GB13000的UCS-2进行存储，
     * 图象信息被解码后存为文件photo.bmp（在directory指定目录下）。
     * @param pMsg
     * @param len
     * @param directory
     * @return
     */
    int ReadBaseMsgWPhoto(char[] pMsg, int[] len, char[] directory);

// 4.2.2.	读卡信息接口 ------------  结束  ---------------------------------------------------------------------------------------


// 4.2.2.	读卡信息接口 ------------  开始  ---------------------------------------------------------------------------------------



// 4.2.3.	读追加地址信息 ------------  开始  ---------------------------------------------------------------------------------------

    /**
     * 说    明：本函数用于读取卡中追加地址信息，输出格式为单字节字符串格式。
     * @param pMsg
     * @param num
     * @return
     */
    int ReadNewAppMsg(char[] pMsg, int num);

    /**
     * 说    明：本函数用于读取卡中追加地址信息，输出格式为单字节字符串格式。
     * @param addr1
     * @param addr2
     * @param addr3
     * @param addr4
     * @param num
     * @return
     */
    int ReadNewAppInfos(char[] addr1,
                        char[] addr2, char[] addr3,
                        char[] addr4, int num);

    /**
     * 说    明：本函数用于读取卡中追加地址信息，信息采用GB13000的UCS-2进行存储
     * @param pMsg
     * @param num
     * @return
     */
    int ReadNewAppMsgW(char[] pMsg, int[] num);

// 4.2.3.	读追加地址信息 ------------  结束  ---------------------------------------------------------------------------------------


    /**
     * 4.2.4.	读卡体管理号
     * 说    明：本函数用于读取身份证卡的管理号
     * @param pMsg
     * @return
     */
    int ReadIINSNDN(char[] pMsg);

    /**
     * 4.2.5.	读模块序列号
     * 说    明：本函数用于读取验证安全控制模块（SAM_V）的序列号。
     * @param pcSAMID
     * @return
     */
    int GetSAMIDToStr(char[] pcSAMID);

    /**
     * 4.3.11.	找IC卡
     * 说    明：本函数用于寻卡。
     * 返 回 值：
     *
     * 值	意义
     * 1	正确
     * 0	错误
     * @return
     */
    int Routon_IC_FindCard(); // 查询ic卡类型

    /**
     * 4.3.12.	读IC卡序列号高级函数
     * 说    明：本函数用于读取IC卡的序列号，自动完成找卡、选卡等过程。
     * 参    数： SN [out] 字符指针，需要在调用时分配内存，字节数不小于16。
     * @param SN
     * @return
     */
    int Routon_IC_HL_ReadCardSN(byte[] SN); // 读取IC卡 卡号

    /**
     * 4.3.15.	控制蜂鸣器和指示灯
     * 说    明：本函数用于控制iDR210 USB-HID 设备的LED指示灯和蜂鸣器。
     * @param BeepON
     * @param LEDON
     * @param duration
     * @return
     */
    int HID_BeepLED(boolean BeepON, boolean LEDON, int duration); // 开启蜂鸣声
}
